package middleware

import (
	"context"
	"encoding/json"
	"fmt"
	"google.golang.org/grpc"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"
	"time"
)

// LogInterceptor 日志拦截器，用于记录每次gRPC调用的详细信息
func LogInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
	// 记录开始时间
	startTime := time.Now()

	// 调用实际的处理函数
	resp, err := handler(ctx, req)

	// 计算耗时
	duration := time.Since(startTime)

	// 格式化请求参数
	reqJSON, _ := json.Marshal(req)

	// 格式化响应参数
	var respJSON []byte
	if resp != nil {
		respJSON, _ = json.Marshal(resp)
	}

	// 获取错误信息
	errMsg := "无错误"
	if err != nil {
		if st, ok := status.FromError(err); ok {
			errMsg = fmt.Sprintf("错误码: %s, 错误信息: %s", codes.Code(st.Code()), st.Message())
		} else {
			errMsg = err.Error()
		}
	}

	// 输出调用日志
	fmt.Printf(
		"[%s] %s | 耗时: %s | 请求: %s | 响应: %s | 错误: %s\r\n",
		startTime.Format("2006-01-02 15:04:05"),
		info.FullMethod,
		duration,
		reqJSON,
		respJSON,
		errMsg,
	)

	return resp, err
}
